<template>
  <div>shallowReactive和shallowRef</div>
  <h3>m1:{{ m1 }}</h3>
  <h3>m2:{{ m2 }}</h3>
  <h3>m3:{{ m3 }}</h3>
  <h3>m4:{{ m4 }}</h3>
  <hr>
  <button @click="update">更新数据</button>
</template>
<script lang="ts">
import { defineComponent, ref, reactive, shallowRef, shallowReactive } from 'vue'
export default defineComponent({
  name: 'App',
  setup() {
    // 深度劫持（深监视）-- 深度响应式
    const m1 = reactive({
      name: '小蓝',
      age: 20,
      car: {
        name: '大巴',
        color: 'red'
      }
    })
    // 浅劫持（浅监视） -- 浅响应式
    const m2 = shallowReactive({
      name: '小蓝',
      age: 20,
      car: {
        name: '大巴',
        color: 'red'
      }
    })
    // 深度劫持（深监视）-- 深度响应式 -- 做了reactive处理
    const m3 = ref({
      name: '小蓝',
      age: 20,
      car: {
        name: '大巴',
        color: 'red'
      }
    })
    // 浅劫持（浅监视） -- 浅响应式
    const m4 = shallowRef({
      name: '小蓝',
      age: 20,
      car: {
        name: '大巴',
        color: 'red'
      }
    })
    const update = () => {
      // 更改m1的数据--reactive
      // m1.name += '=='
      // m1.car.name += '=='
      // 更改m2的数据--shallowReactive
      // m2.name += '=='
      // m2.car.name += '=='
      // 更改m3的数据--ref
      // m3.value.name += '=='
      // m3.value.car.name += '=='
      // 更改m4的数据--shallowRef
      // m4.value.name += '=='
      // m4.value.car.name += '=='
      console.log(m3, m4);


      /**
       * 总结： 一般情况下使用ref和reactive即可
       * 如果有一个对象数据，结构比较深，但变化时只是外层属性变化 ===> shallowReactive
       * 如果有一个对象数据，后面会产生新的对象来替换 ===> shallowRef
       */
    }
    return {
      m1, m2, m3, m4, update
    }
  }
})
</script>